package org.nutz.lang.inject;

import java.lang.reflect.Field;

import org.nutz.castor.Castors;
import org.nutz.lang.Lang;
import org.nutz.log.Log;
import org.nutz.log.Logs;

public class InjectByField implements Injecting {
	
	private static final Log log = Logs.get();

	private Field field;

	public InjectByField(Field field) {
		this.field = field;
		this.field.setAccessible(true);
	}

	public void inject(Object obj, Object value) {
		Object v = null;
		try {
			v = Castors.me().castTo(value, field.getType());
			field.set(obj, v);
		}
		catch (Exception e) {
			if (log.isInfoEnabled())
				log.info("Fail to set value by field", e);
			throw Lang.makeThrow(	"Fail to set '%s'[ %s ] to field %s.'%s' because [%s]: %s",
									value,
			                     	v,
									field.getDeclaringClass().getName(),
									field.getName(),
									Lang.unwrapThrow(e),
									Lang.unwrapThrow(e).getMessage());
		}
	}
}
